package univ.lille1.fr.rest;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.SocketException;

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;

import univ.lille1.fr.rest.bean.UserBean;

public class PasserelleREST {

	private UserBean bean;
	private FTPClient ftpClient;

	/**
	 * Constructeur
	 * 
	 * @param user
	 * @param password
	 */
	public PasserelleREST(String user, String password) {
		this.ftpClient = new FTPClient();
		this.bean = new UserBean(user, password);
	}

	/**
	 * Connection host + port
	 * 
	 * @param host
	 * @param port
	 * @return
	 * @throws SocketException
	 * @throws IOException
	 */
	public void connect(String host, int port) throws SocketException,
			IOException {
		this.ftpClient.connect(host, port);
		this.login();
	}

	/**
	 * Connection host seulement
	 * 
	 * @param host
	 * @return
	 * @throws IOException
	 */
	public void connect(String host) throws IOException {
		this.ftpClient.connect(host);
		this.login();
	}

	/**
	 * Se connect avec les identifiants du bean
	 * 
	 * @throws IOException
	 */
	public void login() throws IOException {
		this.bean.setConnected(this.ftpClient.login(bean.getUser(),
				bean.getPassword()));
	}

	/**
	 * Liste l'ensemble du répertoire sans parent
	 * 
	 * @throws IOException
	 */
	public FTPFile[] list() throws IOException {
		return this.ftpClient.listFiles();
	}

	/**
	 * Liste l'ensemble du répertoire avec un parent
	 * 
	 * @throws IOException
	 */
	public FTPFile[] list(String parent) throws IOException {
		return this.ftpClient.listFiles(parent);
	}

	/**
	 * Récupère le fichier
	 * 
	 * @param remote
	 * @param local
	 * @throws IOException
	 */
	public void retr(String remote, OutputStream local) throws IOException {
		this.ftpClient.retrieveFile(remote, local);
	}

	/**
	 * Envoi le fichier
	 * 
	 * @param remote
	 * @param local
	 * @throws IOException
	 */
	public void store(String remote, InputStream local) throws IOException {
		this.ftpClient.storeFile(remote, local);
	}

	/**
	 * Se déplace dans le répertoire
	 * 
	 * @param path
	 * @throws IOException
	 */
	public void cwd(String path) throws IOException {
		this.ftpClient.cwd(path);
	}

	/**
	 * Passage en mode passive
	 */
	public void passivMode() {
		this.ftpClient.enterLocalPassiveMode();
	}

	/**
	 * Passage en mode active
	 */
	public void activMode() {
		this.ftpClient.enterLocalActiveMode();
	}

	/**
	 * déconnecte l'utilisateur
	 * 
	 * @throws IOException
	 */
	public void disconnect() throws IOException {
//		bean.setConnected(false);
		this.ftpClient.logout();
		this.ftpClient.disconnect();
	}

	public FTPClient getFtpClient() {
		return this.ftpClient;
	}

	public void setFtpClient(FTPClient ftpClient) {
		this.ftpClient = ftpClient;
	}

	public UserBean getBean() {
		return bean;
	}

	public void setBean(UserBean bean) {
		this.bean = bean;
	}
}
